package jsyf.com.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 驼峰和下划线互转工具类
 *
 * @author GUOQI
 * 2017-10-30 09:23:56
 */
public class CamelConvertUtil {

    /**
     * 转变的依赖字符
     */
    public static final char UNDERLINE = '_';

    /**
     * 将驼峰转换成"_"(userId => user_id)
     *
     * @param param
     * @return
     */
    public static String camelToUnderline(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append(UNDERLINE);
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 将"_"转成驼峰(user_id => userId)
     *
     * @param param
     * @return
     */
    public static String underlineToCamel(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (c == UNDERLINE) {
                if (++i < len) {
                    sb.append(Character.toUpperCase(param.charAt(i)));
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 将"_"转成驼峰(user_id => userId)
     *
     * @param param
     * @return
     */
    public static String underlineToCamel2(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        StringBuilder sb = new StringBuilder(param);
        Matcher mc = Pattern.compile(UNDERLINE + "").matcher(param);
        int i = 0;
        while (mc.find()) {
            int position = mc.end() - (i++);
            String.valueOf(Character.toUpperCase(sb.charAt(position)));
            sb.replace(position - 1, position + 1, sb.substring(position, position + 1).toUpperCase());
        }
        return sb.toString();
    }


    /**
     * 测试
     */
    public static void main(String[] args) {
        System.out.println(camelToUnderline("userNameAll"));
        System.out.println(underlineToCamel("USER_NAME_ALL"));
        System.out.println(underlineToCamel2("user_name_all"));
        System.out.println(camelToUnderline("{\n" +
                "  \"data\": {},\n" +
                "  \"e\": {\n" +
                "    \"code_id\": 1,\n" +
                "    \"descNo\": \"创建人Id不能为空\"\n" +
                "  }\n" +
                "}"));
    }
}
